/*
 * acionar_driver.c
 *
 *  Created on: 06/11/2009
 *      Author: ivansalles
 */

#include <fs.h>
#include <pcb.h>
#include <driver.h>
#include <damaged_block.h>

#include <sys/ipc.h>			/* for msgget(), msgctl() */
#include <sys/msg.h>			/* for msgget(), msgctl() */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

int acionar_driver(int end_bloco,char mode,int pid,void* buffer,int tam){

	requisicao req;

	resposta resp;

	req.end_bloco = end_bloco;
	req.mode = mode;
	req.pid= pid;
	memcpy(req.buffer, buffer, BLOCK_SIZE);
	req.num_bytes = tam;

    /*
     * Variaveis relativas a fila, id e key
     */
    int queue_id_req;

    int queue_id_resp;
    /*
     * Cria a fila de mensagens, 0666 e o modo que significa que
     * qualquer um pode ler e escrever nessa fila!
     */
    if( (queue_id_req = msgget(DRIVER_QUEUE_REQ,0)) == -1 ) {
		errno =  ERRNO_DRIVER_INACESSIVEL;
    	return -1;
	}

    if( (queue_id_resp = msgget(DRIVER_QUEUE_RESP,0)) == -1 ) {
    		errno =  ERRNO_DRIVER_INACESSIVEL;
        	return -1;
    	}

    /*
	 * Envia a mensagem... usa a identificacao da fila, um ponteiro
	 * para o buffer, e o tamanho dos dados enviados
	 */

    if( msgsnd(queue_id_req,(struct msgbuf *)&req,sizeof(requisicao)-sizeof(long),0) == -1 ) {
		errno = ERRNO_DRIVER_INACESSIVEL;
		return -1;
    }

	 // Recebe qualquer mensagem do tipo MESSAGE_MTYPE

	if( msgrcv(queue_id_resp,(struct msgbuf *)&resp,sizeof(resposta)-sizeof(long),pid,0) == -1 ) {
		errno = ERRNO_DRIVER_INACESSIVEL;
		return -1;
	}

	if(mode == READ_REQUEST){
		//Copia os dados enviados pelo driver para o buffer.
		memcpy(buffer, resp.buffer, BLOCK_SIZE);
	}

	if(resp.status == ERR_BLOCODADANIFICADO){
		damaged_block(req.end_bloco);
	}

	return resp.status;
}

